#include <stdio.h>

// int main()
// {
//     //理解补码 https://www.bilibili.com/video/BV1ps4y1d73V?p=12 
//     //查看是用的大端还是小端方式
//     int a = 1;
//     if(*(char*)&a == 1)
//         printf("小端\n");
//     return 0;
// }




// int main()
// {
//     char a= -1;
//     signed char b=-1;
//     unsigned char c=-1;//1111 1111
//     printf("a=%d,b=%d,c=%d",a,b,c);//涉及到数据截断和整型提升（拓展）
//     //结果为a=-1,b=-1,c=255
//     return 0;
// }




// int main()
// {
//     char a = -128;//1000 0000 提升 高位全补1
//     printf("%u\n",a);//%u 打印无符号整数 结果为4294967168
//     printf("%d\n",a);//结果为-128
//     return 0;
// }




// #include <windows.h>
// int main()
// {
//     unsigned int i;
//     for(i = 9; i >= 0; i--)
//     {
//         printf("%u\n",i);//0-> -1  -1为全1
//         Sleep(1000);//休眠1000毫秒
//     }
//     return 0;
// }



// int main()
// {
//     char a[1000];
//     int i;
//     for(i=0; i<1000; i++)
//     {
//         a[i] = -1-i;
//         //-1 -2 -3 ...-128,127,126...2,1,0  0代表'\0',字符串结束
//         //看下笔记本上char（8bit）范围内整数的变化规律
//     }
//     printf("%d",strlen(a));
//     return 0;
// }



// #include <string.h>
// int main()
// {
//     if(strlen("abc")-strlen("dbcdef") >= 0) //无符号数，易错
//         printf(">\n");
//     else
//         printf("<\n");
//     return 0;
// }



// int main()
// {
//     int n = 9;
//     float *pFloat = (float *)&n;
//     printf("n的值为：%d\n",n);
//     printf("*pFloat的值为：%f\n",*pFloat);
//     *pFloat = 9.0;
//     printf("num的值为：%d\n",n);
//     printf("*pFloat的值为：%f\n",*pFloat);
//     return 0;
// }




//输入一个整数数组，实现一个函数，使数组中所有奇数
//排列在前半部分，偶数位于后半部分


// int main()
// {
//     int arr[10] = {0};
//     int i = 0;
//     for(i = 0;i < 10;i++)
//     {
//         //scanf("%d",&arr[i]);  还有另一种写法
//         scanf("%d",arr+i);
//     }
//     //调整顺序
//     int arr1[10]={0};
//     int* start = arr1;
//     int* end = arr1+10;
//     for(i = 0;i < 10;i++)
//     {
//         if(arr[i]%2 == 1)
//         {
//             *start = arr[i];
//             start++;
//         }
//         if(arr[i]%2 == 0)
//         {
//             *end = arr[i];
//             end--;
//         }
//     }
//     for(i = 0;i < 10;i++)
//     {
//         printf("%d ",arr1[i]);
//     }
//     printf("\n");
//     return 0;
// }

//自己写的没有写成函数，同时创建了新数组，旧数组还要再复制回去
// void move_odd_even(int* arr,int sz)  //左参数也可以写int arr[]
// {
//     int* left = arr;
//     int* right = arr+sz;
//     int temp = 0;
//     while(left < right)
//     {
//         //最好还要在两个while里加上判断条件避免越界访问
//         while(left<right&&*left%2 == 1)
//         {
//             left++;
//         }
//         while(*right%2 == 0)
//         {
//             right--;
//         }
//         if(left<right&&left < right)//这个条件必须有
//         {
//             temp = *left;
//             *left = *right;
//             *right = temp;
//             //交换完此时left和right位置都可以跳过了
//             left++;
//             right--;
//         }
//     }
// }
// int main()
// {
//     int arr[10] = {0};
//     int i = 0;
//     int sz = sizeof(arr) / sizeof(arr[0]);
//     for(i = 0;i < sz;i++)
//     {
//         //scanf("%d",&arr[i]);  还有另一种写法
//         scanf("%d",arr+i);
//     }
//     //调整顺序
//     move_odd_even(arr,sz);
//     for(i = 0;i < 10;i++)
//     {
//         printf("%d ",arr[i]);
//     }
//     printf("\n");
//     return 0;
// }




//有序数组合并
//输入三行 第一行 n 和 m 分别代表两个升序数组的元素个数
//第二行 n个升序整数 空格分隔 
//第三行 m个升序整数 空格分隔
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d",&n,&m);
    int arr1[n];//变长数组不支持初始化
    int i = 0;
    for(i=0;i<n;i++)
    {
        scanf("%d",arr1+i);
    }
    int arr2[m];
    for(i=0;i<m;i++)
    {
        scanf("%d",arr2+i);
    }
    int arr[n+m];
    i = 0;
    int j = 0;
    int k = 0;
    while(k<n+m)
    {
        if(arr1[i] <= arr2[j])
        {
            arr[k] = arr1[i];
            i++;
        }
        else
        {
            arr[k]=arr2[j];
            j++;
        }
        k++;
    }
    for(i=0;i<m+n;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}